package com.tool.imp.ap;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Row;

import com.tool.BillType;
import com.tool.DataCenterVO;
import com.tool.imp.BillVO;
import com.tool.imp.ImportBase;
import com.tool.imp.KeyGenerator;
import com.tool.imp.ParseExcelException;

/**
 * AP测试道具导入实现类
 * 
 * @author Evan.Hu
 * 
 */
public class ApBillImp extends ImportBase {
	/**
	 * 定义Excel读取列 对应字段
	 */
	protected static Map<Integer, String> xlsMap;

	public ApBillImp(DataCenterVO dbVo, String xlsPath, Boolean fileFlag) {
		super(BillType.AP, dbVo, xlsPath, fileFlag);
	}

	static {
		xlsMap = new HashMap<Integer, String>();

		// 定义读取填充序列,仅作为参考
		xlsMap.put(0, "number");
		xlsMap.put(1, "billDate");
		xlsMap.put(2, "amount");
		xlsMap.put(3, "entries.material");
		xlsMap.put(4, "entries.amount");

	}

	/**
	 * 将两个VO的分录进行合并保存在destVo对象中
	 * 
	 * @param destVo
	 * @param srcVo
	 */
	protected void compositEntry(BillVO destVo, BillVO srcVo) {
		ApBillVO destVo2 = (ApBillVO) destVo;
		ApBillVO srcVo2 = (ApBillVO) srcVo;

		destVo2.getEntries().addAll(srcVo2.getEntries());
	}

	/**
	 * 解析（或者也可以检查基础资料）
	 * 
	 * @return
	 */
	protected BillVO parseRow(Row row) throws ParseExcelException {
		ApBillVO record = new ApBillVO();
		// 按照定义的文件，进行Excel文件读取
		record.setNumber(getCellValue(row, 0));
		record.setBillDate(getDateValue(row, 1));
		record.setAmount(convertToDecimal(getCellValue(row, 2)));
		ApEntryVO entry = new ApEntryVO();
		record.getEntries().add(entry);
		entry.setMaterial(getCellValue(row, 3));
		entry.setAmount(convertToDecimal(getCellValue(row, 4)));

		// TODO需要再次检查基础资料完整性

		return record;
	}

	/**
	 * 
	 */
	protected void process() throws Exception {
		// 某条单据保存不成功，将继续执行设置保存操作

		for (BillVO billVo : records) {
			ApBillVO apVo = (ApBillVO) billVo;

			// 设置校验等信息
			setDefaultValue(apVo);

			// 重复性校验
			boolean isDup = checkNumberDuplicate(apVo);

			if (isDup) {
				getMsgBean().getErrList().add(apVo.getNumber() + "|单据号重复");
			} else {
				// 保存VO至数据库
				boolean isSuc = apVo.saveVO(dbVo);
				if (isSuc) {
					getMsgBean().getSucList().add(apVo.getNumber());
				} else {
					getMsgBean().getErrList().add(apVo.getNumber() + "|保存失败");
				}
			}
		}
	}

	/**
	 * 设置默认值
	 * 
	 * @param vo
	 */
	private void setDefaultValue(ApBillVO vo) {
		vo.setID(KeyGenerator.randomKey20());
		vo.setCreator("test");
		for (int i = 0, size = vo.getEntries().size(); i < size; i++) {
			ApEntryVO entry = vo.getEntries().get(i);
			entry.setID(KeyGenerator.randomKey20());
			entry.setParent(vo);
			entry.setSeq(i + 1);
		}
	}
}
